//
// Created by benxb on 2021/12/24.
//

#include <gtest/gtest.h>
#include <index/linear_index_page.h>

TEST(IndexPageTest, AppendIndex) {
    benxdb::LinearIndexPage page(benxdb::STYPE_FLOAT);
    float key1 = 1.231;
    float key2 = 3.231;
    float key3 = 9.231;
    benxdb::LinearIndexLeafPair pair1(benxdb::STYPE_FLOAT, reinterpret_cast<const char *>(&key1), 0);
    benxdb::LinearIndexLeafPair pair2(benxdb::STYPE_FLOAT, reinterpret_cast<const char *>(&key2), 1);
    benxdb::LinearIndexLeafPair pair3(benxdb::STYPE_FLOAT, reinterpret_cast<const char *>(&key3), 2);
    page.AppendIndexPair(pair1);
    page.AppendIndexPair(pair2);
    page.AppendIndexPair(pair3);
    auto gpair1 = page.GetIndexPair(0);
    auto gpair2 = page.GetIndexPair(1);
    auto gpair3 = page.GetIndexPair(2);
    GTEST_ASSERT_EQ(gpair1.key.GetAs<float>(), pair1.key.GetAs<float>());
    GTEST_ASSERT_EQ(gpair2.key.GetAs<float>(), pair2.key.GetAs<float>());
    GTEST_ASSERT_EQ(gpair3.key.GetAs<float>(), pair3.key.GetAs<float>());
    GTEST_ASSERT_EQ(page.GetKeyType(), benxdb::STYPE_FLOAT);
    GTEST_ASSERT_EQ(page.GetIndexSize(), 3);
    GTEST_ASSERT_EQ(page.GetFreeSlotSize(), (benxdb::PAGE_SIZE - page.GetHeaderSize())/12-3);
}

TEST(IndexPageTest, AppendManyIndex) {
    benxdb::LinearIndexPage page(benxdb::STYPE_FLOAT);
    std::vector<benxdb::LinearIndexLeafPair> pairs;
    float key1 = 1.231;
    float key2 = 3.231;
    float key3 = 9.231;
    benxdb::LinearIndexLeafPair pair1(benxdb::STYPE_FLOAT, reinterpret_cast<const char *>(&key1), 0);
    benxdb::LinearIndexLeafPair pair2(benxdb::STYPE_FLOAT, reinterpret_cast<const char *>(&key2), 1);
    benxdb::LinearIndexLeafPair pair3(benxdb::STYPE_FLOAT, reinterpret_cast<const char *>(&key3), 2);
    pairs.emplace_back(pair1);
    pairs.emplace_back(pair2);
    pairs.emplace_back(pair3);
    page.AppendIndexPairs(pairs);
    auto gpair1 = page.GetIndexPair(0);
    auto gpair2 = page.GetIndexPair(1);
    auto gpair3 = page.GetIndexPair(2);
    GTEST_ASSERT_EQ(gpair1.key.GetAs<float>(), pair1.key.GetAs<float>());
    GTEST_ASSERT_EQ(gpair2.key.GetAs<float>(), pair2.key.GetAs<float>());
    GTEST_ASSERT_EQ(gpair2.record_id, pair2.record_id);
    GTEST_ASSERT_EQ(gpair3.key.GetAs<float>(), pair3.key.GetAs<float>());
    GTEST_ASSERT_EQ(gpair3.record_id, pair3.record_id);
    GTEST_ASSERT_EQ(page.GetKeyType(), benxdb::STYPE_FLOAT);
    GTEST_ASSERT_EQ(page.GetIndexSize(), 3);
    GTEST_ASSERT_EQ(page.GetFreeSlotSize(), (benxdb::PAGE_SIZE - page.GetHeaderSize())/12-3);
}